// 做axios的初始化操作

// 定义常量 ，不变的字符串，如果数量比较多，新建js去管理这些常量
const TOKEN_ERROE = "登录超时，请重新登录"
const NETWORK_ERROE = '请求超时，请检查你的网络配置'
import config from '../config'
import axios from 'axios'
import storage from './storage'
const http = axios.create({
    baseURL: config.baseUrl,
    timeout: 8000
})


// axios的重要功能：拦截器  interceptor
// 作用：把请求和响应拆分更加细致 为了给程序员添加操作的机会
// 使用场景：在请求拦截的过程中添加token
//          在响应拦截的过程中统一拦截错误处理

// 怎么操作：
// 添加一个请求拦截器
http.interceptors.request.use((config) => {
    // config 请求配置
    // 注意：一定要返回，请求才能正常进行
    // console.log(config);
    let headers = config.headers;
    const { token } = storage.getItem("userInfo");
    // const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjp7ImRlcHRJZCI6WyI2MDE2NzA1OWM5MDI3YjdkMmM1MjBhNjEiXSwic3RhdGUiOjEsInJvbGUiOjAsInJvbGVMaXN0IjpbIjYwOTc4MWI0NWNjZDE4MzA4NGY4ZWEzZCIsIjYwOTc4MWMxNWNjZDE4MzA4NGY4ZWEzZSJdLCJfaWQiOiI2MDY0MDJjYTk5MzQwMTgzYTk1ZWNjYjAiLCJ1c2VySWQiOjEwMDAwMDcsInVzZXJOYW1lIjoiYWRtaW4iLCJ1c2VyRW1haWwiOiJhZG1pbkBibHVlai5jb20ifSwiaWF0IjoxNjU5OTQwMjE0LCJleHAiOjE2NTk5NDM4MTR9.Z-9dQKvu9wWiqaBenQdHjkU-WFHHD_j59MFETNH_VQQ"
    // 判断这个请求头有没有，没有就添加上去
    if (!headers.Authorization) {
        headers.Authorization = 'Bearer ' + token
    }
    return config
})

// 添加一个响应拦截
http.interceptors.response.use((res) => {
    // res是请求响应内容
    // 先做响应拦截处理
    const { code, data, msg } = res.data
    if (code == 200) {
        // 如果code成功，直接返回数据到客户端即可
        return data
    } else if (code === 40001) {
        // 错误提示
        console.log(TOKEN_ERROE);
        // 需要返回一个外面可以捕获错误的对象
        // 所以要返回一个promise的错误对象
        return Promise.reject(TOKEN_ERROE);
    } else {
        // 如果进入该分支，说明没有 code 请求超过我们的timeout
        console.log(NETWORK_ERROE);
        return Promise.reject(NETWORK_ERROE);
    }
})


// 封装各类请求
// get  post 两个请求的参数
function request (options) {
    // options是将来使用过程中传递的具体配置
    // 如果是post
    options.method = options.method || 'get'
    if (options.method === 'get') {
        options.params = options.data
    }
    return http(options)
}

const requestList = ['get', 'post']
requestList.forEach(item => {
    request[item] = (url, data, options) => {
        return request({
            url, data, method: item, ...options
        })
    }
})
export default request

// post
// export function post (url, data) {
//     return new Promise((resolve, reject) => {
//         http.post(url, data, {
//             headers: {
//                 "Content-type": "application/json",
//             },
//         })
//             .then(res => {
//                 resolve(res.data)
//                 console.log(res);
//             })
//             .catch(err => {
//                 reject(err)
//             })
//     })
// }